package cn.smxy.category.service;

import cn.smxy.dto.FamilyDto;
import cn.smxy.param.FamilyFuzzyParam;
import cn.smxy.param.FamilyIdsParam;
import cn.smxy.pojo.PlantFamily;
import cn.smxy.util.R;

import java.util.List;

public interface PlantFamilyService {


    /**
     * 返回科属树形目录
     * 1.数据库查询所有该种群下的科属
     * 2.处理查询到的集合，嵌套成树形目录
     * 3.返回封装结果
     * @param categoryId 种群id
     * @return
     */
    R directory(Long categoryId);

    /**
     * 展示所有科名
     * @param categoryId
     * @return
     */
    R show(Long categoryId);

    /**
     * 添加新科名
     * 1.正则校验是否符合规则
     * 2.查询数据库是否存在相同名称
     * 3.添加到数据库
     * @param plantFamily
     * @return
     */
    R addFamily(PlantFamily plantFamily);

    /**
     * 添加新属名
     * 1.正则校验是否符合规则
     * 2.查询同科下是否存在相同属名
     * 3.添加到数据库
     * @param plantFamily
     * @return
     */
    R addGenus(PlantFamily plantFamily);

    /**
     * 返回科属全称字符串接口
     * 1.数据库查询id对应名称
     * 2.查询父类id对应名称
     * 3.返回封装科属名称
     * @param familyId 科属id
     * @return 科属名称
     */
    FamilyDto full(Long familyId);

    /**
     * 查询科属id的所有子集id集合
     * 1.查询familyId相等的集合
     * 2.从集合中找出parentId==0的id集合，!=0存入结果Set集合中，Set集合去重
     * 3.再次查询数据库查询parentId等于该familyId的集合
     * 4.将新集合的id存入Set集合中
     * 5.将Set集合转成List后返回
     * @param familyIdsParam 科属id集合
     * @return 科属id集合
     */
    List<Long> list(FamilyIdsParam familyIdsParam);

    /**
     * 按条件分页查询科属
     * 1.判断科属是否为空，不为空封装条件
     * 2.判断种群id是否为空，不为空封装条件
     * 3.判断科属id是否为空，不为空封装条件
     * 4.封装分页条件
     * 5.数据库查询
     * 6.结果封装，封装成更适合展示的PlantFamilyVo
     * @param familyFuzzyParam 种群id 科属id 分页参数 模糊查询科属名
     * @return
     */
    R fuzzy(FamilyFuzzyParam familyFuzzyParam);

    /**
     * 删除科属
     * 1.判断父节点是否为0
     * 1.1 父节点为0则为科，需要删除该科下所有属
     * 1.2 父节点不为0直接删除即可
     * @param familyId
     * @return
     */
    R familyRemove(Long familyId);

    /**
     * 返回属名列表
     * @param familyId
     * @return
     */
    R genusShow(Long familyId);
}
